package com.solome.core;

import java.io.ByteArrayOutputStream;
import java.io.Serializable;
import java.util.zip.GZIPOutputStream;

/*********************************************************************
 * @version 0.1
 * @author soells
 */
public abstract class CoreObject /* extends CacheObject */implements
		ManageObject, Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 3915189047476117509L;

	/** 对象创建时间 */
	protected long createTime;

	/** 上次更新时间 */
	protected long lastUpdateTime;

	// /** 脏数据标记 */
	// protected boolean dirty;

	/** 对象名称 */
	protected String name;

	// /**
	// * 构造函数
	// */
	public CoreObject() {
		createTime = System.currentTimeMillis();
	}

	// /*
	// * (non-Javadoc)
	// *
	// * @see
	// * org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
	// */
	// @Override
	// public void afterPropertiesSet() throws Exception {
	// logger = new Logger(getClass().getSimpleName());
	// }

	// /*
	// * (non-Javadoc)
	// *
	// * @see com.solome.core.ServerObject#getCreateTime()
	// */
	// @Override
	// public long getCreateTime() {
	// return createTime;
	// }

	/**
	 * 进入压缩操作
	 * 
	 * @param dataSrc
	 *            原始数据
	 * @return 压缩后的数据
	 */
	public byte[] doCompress(byte[] dataSrc) {
		ByteArrayOutputStream baos = null;
		GZIPOutputStream gzout = null;
		try {
			baos = new ByteArrayOutputStream();
			gzout = new GZIPOutputStream(baos);
			gzout.write(dataSrc);
			gzout.finish();
			gzout.flush();
			baos.flush();
			return baos.toByteArray();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (gzout != null)
					gzout.close();
				if (baos != null)
					baos.close();
			} catch (Exception e) {
			}
		}
		return null;
	}

	// /*
	// * (non-Javadoc)
	// *
	// * @see com.solome.core.ServerObject#getLastUpdateTime()
	// */
	// @Override
	// public long getLastUpdateTime() {
	// return lastUpdateTime;
	// }

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.solome.game.core.ManageObject#getCreateTime()
	 */
	@Override
	public long getCreateTime() {
		return this.createTime;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.solome.game.core.ManageObject#getLastUpdateTime()
	 */
	@Override
	public long getLastUpdateTime() {
		return this.lastUpdateTime;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.solome.core.ServerObject#getName()
	 */
	@Override
	public String getName() {
		return name;
	}

	/**
	 * 获取资源工厂
	 * 
	 * @return
	 */
	// public ResourceFactory getResourceFactory() {
	// return ResourceFactory.getInstance();// .getResourceFactory();
	// }

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.solome.core.ServerObject#initialize()
	 */
	@Override
	public void initialize() {
		// lastUpdateTime = System.currentTimeMillis();
	}

	// /*
	// * (non-Javadoc)
	// *
	// * @see com.solome.game.core.ManageObject#setLastUpdateTime(long)
	// */
	// @Override
	// public void setLastUpdateTime(long time) {
	// this.lastUpdateTime = time;
	// }

	/**
	 * 从查询结果的代理类中读取数据，转移到本类中来
	 * 
	 * @param ob
	 * @throws Exception
	 */
	// public boolean readProxy(Object ob) {
	// Class<?> cl = null;
	// if (!(ob instanceof Factory)) {
	// cl = ob.getClass();
	// } else {
	// Factory factory = (Factory) ob;
	// // 注意:对象在获取Class时用getClass()方法,类型获取Class是用.class属性
	// cl = factory.getClass();
	// }
	// while (cl != null) {
	//
	// Field fields[] = cl.getDeclaredFields();
	// if (fields == null)
	// break;
	//
	// for (Field f : fields) {
	// String fieldName = f.getName();
	// if (fieldName.toLowerCase().contains("cglib"))
	// continue;
	// if (fieldName.equals("serialVersionUID"))
	// continue;
	//
	// String firstLetter = fieldName.substring(0, 1).toUpperCase();//
	// 注意:get,set方法的第一个字母大写
	// String getMethodName = "get" + firstLetter
	// + fieldName.substring(1);
	// String setMethodName = "set" + firstLetter
	// + fieldName.substring(1);
	//
	// try {
	// Method getMethod = cl.getMethod(getMethodName,
	// new Class[] {});
	// Method setMethod = cl.getMethod(setMethodName,
	// new Class[] { f.getType() });
	// // 注意:调用的ob的函数,而不是新的的对 象的函数
	// Object getMethodReturn = getMethod.invoke(ob,
	// new Object[] {});
	// // 在新对象里调用函数,注意最后一个参数是Object类型的,也就是说必须要是一个对象,而不是一个类型
	// setMethod.invoke(this, new Object[] { getMethodReturn });
	// } catch (Exception ex) {
	// }
	// }
	//
	// cl = cl.getSuperclass();
	// if (cl == null)
	// break;
	// if (cl.equals(Object.class))
	// break;
	// }
	//
	// return true;
	// }

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.solome.game.core.ManageObject#setLastUpdateTime(long)
	 */
	@Override
	public void setLastUpdateTime(long time) {
		this.lastUpdateTime = time;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.solome.core.ServerObject#setName(java.lang.String)
	 */
	@Override
	public void setName(String name) {
		this.name = name;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.solome.game.core.ManageObject#wrapAppendToBuffer(org.apache.mina.core
	 * .buffer.IoBuffer)
	 */
	// @Override
	// public void wrapAppendToBuffer(IoBuffer buffer) {
	// buffer.put(wrapAsByteArray());
	// }
	//
	// /*
	// * (non-Javadoc)
	// *
	// * @see com.solome.game.core.ManageObject#wrapAsByteArray()
	// */
	// @Override
	// public byte[] wrapAsByteArray() {
	//
	// return null;
	// }
	//
	// /**
	// *
	// * @return
	// */
	// public Element wrapAsMemoryXML() {
	// Element xml = new DefaultElement("Class");
	//
	// xml.addAttribute("class", this.getClass().getName());
	//
	// Class<?> _class = getClass();
	// while (!_class.equals(CoreObject.class)) {
	// for (Field field : _class.getDeclaredFields()) {
	//
	// if (field.getName().equals("serialVersionUID"))
	// continue;
	// if (!field.getType().isPrimitive()) {
	// continue;
	// }
	// if (Modifier.isStatic(field.getModifiers()))
	// continue;
	//
	// try {
	// String name = "";
	// name += (field.getType().equals(boolean.class) ? "is"
	// : "get")
	// + field.getName().substring(0, 1).toUpperCase()
	// + field.getName().substring(1,
	// field.getName().length());
	// Method method = _class.getMethod(name);
	// Object map = method.invoke(this);
	//
	// Element pro = xml.addElement("property");
	// pro.addAttribute("name", field.getName());
	// pro.addAttribute("type", field.getType().getSimpleName());
	// pro.addAttribute("value", map.toString());
	//
	// } catch (Exception ex) {
	// ex.printStackTrace();
	// }
	// }
	// _class = _class.getSuperclass();
	// }
	//
	// return xml;
	// }
	//
	// /**
	// * 将POJO打包成XML
	// *
	// * @param name
	// * @return
	// */
	// public Element wrapAsXML(String name) {
	// Element element = new DefaultElement(name);
	//
	// Class<?>[] _classes = { super.getClass(), getClass() };
	// for (Class<?> _class : _classes) {
	// Method[] methods = _class.getMethods();
	// if (methods != null) {
	// for (Method method : methods) {
	// String methodName = method.getName();
	// if (methodName.startsWith("get")
	// || methodName.startsWith("is")) {
	// String property = "";
	// if (methodName.startsWith("get"))
	// property = methodName.substring(3,
	// methodName.length());
	// if (methodName.startsWith("is"))
	// property = methodName.substring(2,
	// methodName.length());
	//
	// try {
	// Object value = method.invoke(this);
	// if ((value instanceof String && value != null && !value
	// .equals(""))
	// || //
	// (value instanceof Integer && (Integer) value > 0)
	// || //
	// value instanceof Double
	// && (Double) value > 0) {
	// // element.addAttribute(property,
	// // value.toString());
	// Element pro = element.addElement(property);
	// pro.addAttribute("type", value.getClass()
	// .getSimpleName());
	// pro.addAttribute("value", value.toString());
	// }
	// } catch (Exception ex) {
	// ex.printStackTrace();
	// }
	// }
	// }
	// }
	// }
	//
	// return element;
	// }

}
